/**
 * 高精度计算工具钩子
 * 提供加减乘除的精确计算功能
 */
const useCalcUtil = () => {
    /**
     * 两数相加，解决精度问题
     * @param {number} num1 - 加数
     * @param {number} num2 - 加数
     * @returns {number} 相加结果
     */
    const calcAdd = (num1, num2) => {
        let r1, r2, m;
        try {
            r1 = num1.toString().split('.')[1].length;
        } catch (e) {
            r1 = 0;
        }
        try {
            r2 = num2.toString().split('.')[1].length;
        } catch (e) {
            r2 = 0;
        }
        m = Math.pow(10, Math.max(r1, r2));
        return Math.round(num1 * m + num2 * m) / m;
    };

    /**
     * 两数相减，解决精度问题
     * @param {number} num1 - 被减数
     * @param {number} num2 - 减数
     * @returns {number} 相减结果
     */
    const calcSub = (num1, num2) => {
        let r1, r2, m, n;
        try {
            r1 = num1.toString().split('.')[1].length;
        } catch (e) {
            r1 = 0;
        }
        try {
            r2 = num2.toString().split('.')[1].length;
        } catch (e) {
            r2 = 0;
        }
        m = Math.pow(10, Math.max(r1, r2));
        return (Math.round((num1 * m - num2 * m)) / m);
    };

    /**
     * 两数相乘，解决精度问题
     * @param {number} num1 - 乘数
     * @param {number} num2 - 乘数
     * @returns {number} 相乘结果
     */
    const calcMult = (num1, num2) => {
        let m = 0;
        const s1 = num1.toString();
        const s2 = num2.toString();
        try {
            m += s1.split('.')[1].length;
        } catch (e) { }
        try {
            m += s2.split('.')[1].length;
        } catch (e) { }
        return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m);
    };

    /**
     * 两数相除，解决精度问题
     * @param {number} num1 - 被除数
     * @param {number} num2 - 除数(不能为0)
     * @returns {number} 相除结果
     */
    const calcDiv = (num1, num2) => {
        if (num2 === 0) {
            throw new Error('除数不能为0');
        }
        let t1 = 0,
            t2 = 0;
        try {
            t1 = num1.toString().split('.')[1].length;
        } catch (e) { }
        try {
            t2 = num2.toString().split('.')[1].length;
        } catch (e) { }
        const r1 = Number(num1.toString().replace('.', ''));
        const r2 = Number(num2.toString().replace('.', ''));
        return (r1 / r2) * Math.pow(10, t2 - t1);
    };

    return {
        calcAdd,
        calcSub,
        calcMult,
        calcDiv,
    };
};

export default useCalcUtil;